package com.dengcj.db;

import cn.hutool.db.DbUtil;
import cn.hutool.db.Entity;
import cn.hutool.db.ds.DSFactory;
import cn.hutool.db.handler.EntityListHandler;
import cn.hutool.db.sql.SqlExecutor;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

/**
 * @author dengchunjie
 * @Description: 结果集对象，为了保持Ecology开发习惯
 * @date 2022/1/12 14:11
 */
public class DB {

    // 数据源对象
    DataSource ds = null;

    public DB(){
        // 获得默认数据源
        ds = DSFactory.get();
    }

    /**
     * 执行非查询类的SQL，返回受影响的行数，一般用于执行update
     * @param sql
     * @param objs
     * @return
     */
    public int execute(String sql, Object... objs){
        Connection conn = null;
        try {
            conn = ds.getConnection();
            // 执行非查询语句，返回影响的行数
            return SqlExecutor.execute(conn, sql, objs);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DbUtil.close(conn);
        }

        return 0;
    }

    /**
     * 执行查询语句，返回实体列表，一个Entity对象表示一行的数据，Entity对象是一个继承自HashMap的对象，存储的key为字段名，value为字段值
     * ex.
     * entity.getStr("lastname");
     * enetiy.getInt("age");
     * @param sql
     * @param objs
     * @return
     */
    public List<Entity> query(String sql, Object... objs){
        Connection conn = null;
        try {
            conn = ds.getConnection();
            return SqlExecutor.query(conn, sql, new EntityListHandler(), objs);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DbUtil.close(conn);
        }

        return null;
    }

    public Entity queryOne(String sql, Object... objs){
        List<Entity> entities = query(sql, objs);
        if(entities != null && entities.size() > 0){
            return entities.get(0);
        }
        return null;
    }

    /**
     * 执行insert， 返回主键
     * @param sql
     * @param objs
     * @return
     */
    public Long insert(String sql, Object... objs){
        Connection conn = null;
        try {
            conn = ds.getConnection();
            // 执行insert，返回自增的键
            return SqlExecutor.executeForGeneratedKey(conn, sql, objs);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DbUtil.close(conn);
        }

        return null;
    }
}
